// 定义Promise构造函数
function Promise(excutor){
    this.PromiseState = "pending";
    this.PromiseResult = undefined;
    this.callbacks = []; // 用于存放待执行函数的属性

    // 声明成功处理内函数
    const success = (value) => {
        // 判断状态PromiseState是否已经不是pending，则退出
        if(this.PromiseState != "pending") return;
        this.PromiseState = "fulfilled";
        this.PromiseResult = value;
        // 执行callbacks属性里面保存下来没有执行的回调（异步导致）
        this.callbacks.forEach(item => {
            // 执行成功的回调方法ok
            item.ok(this.PromiseResult);
        });
    }
    const error = (reason) => {
        // 判断状态PromiseState是否已经不是pending，则退出
        if(this.PromiseState != "pending") return;
        this.PromiseState = "rejected";
        this.PromiseResult = reason;
        // 执行callbacks属性里面保存下来没有执行的回调（异步导致）
        this.callbacks.forEach(item => {
            // 执行失败的回调方法ng
            item.ng(this.PromiseResult);
        });
    } 
    try {
        // 执行excutor函数，要求传递两个函数类型参数
        excutor(success, error);
    } catch (e) {
        error(e);
    }
    
}

// 在Promise构造函数的原型上添加then方法
Promise.prototype.then = function(onResolved, onRejected){
    // 判断PromiseState状态值来执行对应的参数函数
    if(this.PromiseState === "fulfilled"){
        onResolved(this.PromiseResult);
    }
    if(this.PromiseState === "rejected"){
        onRejected(this.PromiseResult);
    }
    // 判断PromiseState状态值为pending时，先将两个参数函数收取起来，等待改变状态是再次执行
    if(this.PromiseState === "pending"){
        // 将当前待调用的回调函数保存起来
        this.callbacks.push({
            // 状态成功时调用方法
            ok:function(value){
                onResolved(value);
            },
            // 状态失败是调用方法
            ng:function(reason){
                onRejected(reason);
            }
        })
    }
}